import type {
	CheckboxProps,
	DatePickerProps,
	DividerProps,
	FormInstance,
	FormItemProps,
	FormProps,
	InputNumberProps,
	InputProps,
	ModalProps,
	RadioGroupProps,
	RadioProps,
	RateProps,
	SelectProps,
	SliderSingleProps,
	StepProps,
	StepsProps,
	SwitchProps,
	TimePickerProps,
	TimeRangePickerProps,
	TreeSelectProps
} from 'antd';
import type { CheckboxGroupProps } from 'antd/es/checkbox';
import type { RangePickerProps } from 'antd/es/date-picker';
import type { TextAreaProps } from 'antd/es/input';
import type { Dispatch, ReactNode, SetStateAction } from 'react';

/** 组件类型 */
export type FormModalProps<T = any> = {
	/** 组件实例 */
	modal?: FormModalInstance<T>;
	/** Modal组件其他配置 */
	modalProps?: Omit<
		ModalProps,
		'open' | 'title' | 'closable' | 'modalRender' | 'destroyOnClose' | 'footer'
	>;
	/** 自定义form表单实例 */
	form?: FormInstance<T>;
	/** Form组件其他配置 */
	formProps?: Omit<FormProps, 'form'>;
	/** 表单项配置 */
	formItems?: FormItemsType;
	/** 多列布局时列的间距，默认：10 */
	columnGap?: number;
	/** 确认按钮的回调 */
	onConfirm?: (values: T) => Promise<void>;
	/** 表单上方插槽 */
	formHeadSlot?: ReactNode;
	/** 表单下方插槽 */
	formFooterSlot?: ReactNode;
	/** close拦截时的modal属性 */
	closeWarnProps?: Omit<ModalProps, 'onOk'>;
	/** 是否全屏弹出 */
	fullscreen?: boolean;
	/** 是否显示全屏切换按钮 */
	fullscreenBtn?: boolean;
	/** 是否开启拖拽，默认：true */
	draggable?: boolean;
	/** 内容区高度 */
	bodyHeight?: number;
	/** 自定义弹窗底部内容，不需要时可传null */
	footer?: ReactNode | null;
};
export type FormItemsType = (FormItem | FormItem[])[];

export type StepFormModalProps<T = any> = {
	/** 组件实例 */
	modal?: FormModalInstance<T>;
	/** Modal组件其他配置 */
	modalProps?: Omit<
		ModalProps,
		'open' | 'title' | 'closable' | 'modalRender' | 'destroyOnClose' | 'footer'
	>;
	/** 自定义form表单实例 */
	form?: FormInstance<T>;
	/** 配置选项卡内容 */
	items?: StepFormItem<T>[];
	/** 步骤条组件其他配置 */
	stepsProps?: Omit<StepsProps, 'items' | 'current'>;
	/** close拦截时的modal属性 */
	closeWarnProps?: Omit<ModalProps, 'onOk'>;
	/** 是否全屏弹出 */
	fullscreen?: boolean;
	/** 是否显示全屏切换按钮 */
	fullscreenBtn?: boolean;
	/** 是否开启拖拽，默认：true */
	draggable?: boolean;
	/** 内容区高度 */
	bodyHeight?: number;
	/** 自定义底部内容，不需要时可传null */
	footer?: ReactNode | null;
};
export interface StepFormItem<T = any> extends StepProps {
	/** Form组件其他配置 */
	formProps?: Omit<FormProps, 'form'>;
	/** 表单项配置 */
	formItems?: FormItemsType;
	/** 多列布局时列的间距（px），默认：10 */
	columnGap?: number;
	/** 表单上方插槽 */
	headSlot?: ReactNode;
	/** 表单下方插槽 */
	footerSlot?: ReactNode;
	/** 下一步的回调 */
	onFinish?: (values: T) => Promise<void>;
}

export type AnyObject = Record<PropertyKey, any>;

export interface ContextStore<T> {
	open: boolean;
	title: string;
	initData?: T;
}

export interface ContextType<T = any> {
	/** 组件公共状态 */
	readonly store?: ContextStore<T>;
	/** 弹出（标题，初始化数据） */
	open: (data?: { title?: string; initData?: T }) => void;
	/** 关闭 */
	close: () => void;
	/** 组件内部方法 */
	__INTERNAL__?: (onChange: Dispatch<SetStateAction<{}>>) => void;
}

export type FormModalInstance<T> = Omit<ContextType<T>, 'setUpdateFn' | '__INTERNAL__'>;

export interface ExtendDatePicker extends DatePickerProps {
	/** 日期格式，默认：YYYY-MM-DD 00:00:00 */
	valueFormat: string;
}
export interface ExtendDateRangePicker extends RangePickerProps {
	/** 日期格式，默认：YYYY-MM-DD 00:00:00 */
	valueFormat: string;
}
export interface ExtendTimePicker extends TimePickerProps {
	/** 时间格式，默认：HH-mm-ss */
	valueFormat: string;
}
export interface ExtendTimeRangePicker extends TimeRangePickerProps {
	/** 时间格式，默认：HH-mm-ss */
	valueFormat: string;
}
interface MapItemConfig {
	Input: InputProps;
	InputNumber: InputNumberProps;
	TextArea: TextAreaProps;
	Select: SelectProps;
	TreeSelect: TreeSelectProps;
	Radio: RadioProps;
	RadioGroup: RadioGroupProps;
	Checkbox: CheckboxProps;
	CheckboxGroup: CheckboxGroupProps;
	Switch: SwitchProps;
	Slider: SliderSingleProps;
	DatePicker: ExtendDatePicker;
	DateRangePicker: ExtendDateRangePicker;
	TimePicker: ExtendTimePicker;
	TimeRangePicker: ExtendTimeRangePicker;
	Rate: RateProps;
	Divider: DividerProps;
}
export type FormItem = {
	[K in keyof MapItemConfig]: { type?: K; props?: MapItemConfig[K] };
}[keyof MapItemConfig] &
	Omit<FormItemProps, 'type' | 'props' | 'name' | 'colSpan'> & {
		name?: string | [string, string];
		// 栅格占位格数（总数24）
		colSpan?: number;
	};
